"""
Interpolation
Un autre client envoie des mises a jour de positions

Elles contiennent :
p1 : position,
s1 : vecteur vitesse,
w1 : orientation


Reception d'une mise a jour :
e0 : etat de l'avatar dans notre monde
e1 : etat de l'avatar dans la mise a jour recue
e2 : etat de l'avatar estime lors de la reception de mise a jour

On appelera le temps entre deux mise a jours dt

Lors de la reception de e1, on doit calculer e2, et ensuite afficher une interpolation entre e0 et e2.
"""

from wavefront import ObjModel
import euclid
import groups
import misc
import scene
import math

update_period = 0.5

class AvatarBase(object):
    def network_update(self, p1, s1, w1):
        pass
    
    def update(self, dt):
        pass


class Avatar(AvatarBase):
    def __init__(self, position):       
        self.height_offset = euclid.Vector3(0., 1.2, 0.)
        self.p0 = euclid.Vector3(*position) - self.height_offset
        self.w0 = 0.
        
        self.p2 = self.p0
        self.w2 = self.w0
        
        self.dp = euclid.Vector3()
        self.dw = 0.
        
        obj_model = ObjModel()
        obj_model.load(groups.pack_transform(self.trans_mat()), misc.data_path("obj/penguin.obj"))
        self.transform = obj_model.transform
        
        self.delete = obj_model.delete

    def network_update(self, p1, s1, w1):
        self.p2 = euclid.Vector3(*p1) - self.height_offset# + s1 * update_period
        self.w2 = w1
        
        self.dp = (self.p2 - self.p0) / update_period
        self.dw = (self.w2 - self.w0) / update_period
    
    def update(self, dt):
        self.p0 += self.dp * dt
        self.w0 += self.dw * dt

        self.transform[:] = self.trans_mat()[:]
        
    def trans_mat(self):
        return euclid.Matrix4.new_translate(*self.p0) * euclid.Matrix4.new_rotatey(self.w0)
        
class Picture(AvatarBase):
    def __init__(self, filename, position, rotation, height, width): 
        transform =  euclid.Matrix4.new_translate(*position) * euclid.Matrix4.new_rotatey(math.radians(rotation))
        self.vlist = scene.create_picture(transform, width, height, misc.data_path(filename))

    def delete(self):
        for item in self.vlist:
            item.delete()


